# -*- coding: utf-8 -*-
import subprocess
import pytest
import os
import sys
from utils.logger import get_logger
from utils.data_helper import get_path

def run_pytest():
    """执行pytest测试并生成报告"""
    html_dir = get_path('reports/html')
    # 确保报告目录存在
    os.makedirs(html_dir, exist_ok=True)
    html_report_path = os.path.join(html_dir, 'test_report.html')
    allure_dir = get_path('reports/allure')
    os.makedirs(allure_dir, exist_ok=True)

    get_logger().info('开始执行测试')
    
    # 构造pytest命令参数列表
    pytest_args = [
        "-s", "-v",
        f"--alluredir={allure_dir}",
        f"--html={html_report_path}",
        "--clean-alluredir",
    ]
    
    # 处理可能从命令行传递的额外参数
    if len(sys.argv) > 1:
        pytest_args.extend(sys.argv[1:])
    
    # 执行pytest并返回结果
    return pytest.main(pytest_args)

def start_allure_server(allure_results_dir):
    """启动allure服务展示报告"""
    try:
        # 检查allure是否可用
        subprocess.run(
            ["allure", "--version"],
            check=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True
        )
        
        # 启动allure服务
        get_logger().info(f"启动allure报告服务，结果目录: {allure_results_dir}")
        subprocess.run(
            ["allure", "serve", allure_results_dir],
            check=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True
        )
        return True
    except subprocess.CalledProcessError as e:
        get_logger().error(f"启动allure报告失败: {e.stderr}")
    except FileNotFoundError:
        get_logger().error("未找到allure命令，请确认已安装并配置环境变量")
    return False

if __name__ == "__main__":
    # 执行测试并获取结果
    test_result = run_pytest()
    
    # 只有测试成功执行后才尝试启动allure服务
    if test_result == 0:
        allure_dir = get_path('reports/allure')
        start_allure_server(allure_dir)
    else:
        get_logger().error(f"测试执行失败，退出码: {test_result}")
        # 非零退出码让Jenkins识别构建失败
        sys.exit(test_result)
